package main

import (
	"fmt"

	"github.com/pkg/errors"
)

func e1() error {
	return errors.Wrap(fmt.Errorf("new error"), "e1 dose not handle")
}

func e2() error {
	err := e1()
	if err != nil {
		return errors.Wrap(err, "e2 dose not handle")
	}
	return nil
}

func e3() error {
	err := e2()
	if err != nil {
		return errors.Wrap(err, "e3 dose not handle")
	}
	return nil
}

func main() {
	err := e3()
	if err != nil {
		fmt.Println("--- print error, verb: none")
		fmt.Println(err)

		fmt.Println("--- print error, verb: \\%\\s")
		fmt.Printf("%s\n", err)

		fmt.Println("--- print error, verb: \\%\\v")
		fmt.Printf("%v\n", err)

		fmt.Println("--- print error, verb: \\%\\+v")
		fmt.Printf("%+v\n", err)

		fmt.Println("--- print error cause, verb: \\%\\+v")
		fmt.Printf("%+v\n", errors.Cause(err))
	}
}

// output:
// --- print error, verb: none
// e3 dose not handle: e2 dose not handle: e1 dose not handle: new error
// --- print error, verb: \%\s
// e3 dose not handle: e2 dose not handle: e1 dose not handle: new error
// --- print error, verb: \%\v
// e3 dose not handle: e2 dose not handle: e1 dose not handle: new error
// --- print error, verb: \%\+v
// new error
// e1 dose not handle
// main.e1
//         /home/ian/workspace/golang/src/gitee.com/baihr/iam/pkg/errors/example/wrap/main.go:10
// main.e2
//         /home/ian/workspace/golang/src/gitee.com/baihr/iam/pkg/errors/example/wrap/main.go:14
// main.e3
//         /home/ian/workspace/golang/src/gitee.com/baihr/iam/pkg/errors/example/wrap/main.go:22
// main.main
//         /home/ian/workspace/golang/src/gitee.com/baihr/iam/pkg/errors/example/wrap/main.go:30
// runtime.main
//         /usr/local/go/src/runtime/proc.go:250
// runtime.goexit
//         /usr/local/go/src/runtime/asm_amd64.s:1598
// e2 dose not handle
// main.e2
//         /home/ian/workspace/golang/src/gitee.com/baihr/iam/pkg/errors/example/wrap/main.go:16
// main.e3
//         /home/ian/workspace/golang/src/gitee.com/baihr/iam/pkg/errors/example/wrap/main.go:22
// main.main
//         /home/ian/workspace/golang/src/gitee.com/baihr/iam/pkg/errors/example/wrap/main.go:30
// runtime.main
//         /usr/local/go/src/runtime/proc.go:250
// runtime.goexit
//         /usr/local/go/src/runtime/asm_amd64.s:1598
// e3 dose not handle
// main.e3
//         /home/ian/workspace/golang/src/gitee.com/baihr/iam/pkg/errors/example/wrap/main.go:24
// main.main
//         /home/ian/workspace/golang/src/gitee.com/baihr/iam/pkg/errors/example/wrap/main.go:30
// runtime.main
//         /usr/local/go/src/runtime/proc.go:250
// runtime.goexit
//         /usr/local/go/src/runtime/asm_amd64.s:1598
// --- print error cause, verb: \%\+v
// new error
